package com.info33.platform.common.util;

import java.text.DecimalFormat;

/**
 * 经纬度计算距离
 *
 * @author debj
 * @version 1.0
 * @date 2021/7/6 14:13
 */
public class PointUtil {

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    private static double result(double radLat1, double radLat2, double a, double b) {
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        s = s * 6378.137;
        DecimalFormat df = new DecimalFormat("#.000");
        s = Double.parseDouble(df.format(s));

        //返回距离默认为km，如果需要其他单位请记得换算
        return s;
    }

    /**
     * 计算两个经纬度之间的距离
     *
     * @param lat1 纬度 1
     * @param lng1 经度 1
     * @param lat2 纬度 2
     * @param lng2 经度 2
     * @return km
     */
    public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lng1) - rad(lng2);
        return result(radLat1, radLat2, a, b);
    }

    /**
     * 计算两个经纬度之间的距离
     *
     * @param lat1 纬度 1
     * @param lng1 经度 1
     * @param lat2 纬度 2
     * @param lng2 经度 2
     * @return km
     */
    public static double getDistance(String lat1, String lng1, String lat2, String lng2) {
        double radLat1 = rad(Double.parseDouble(lat1));
        double radLat2 = rad(Double.parseDouble(lat2));
        double a = radLat1 - radLat2;
        double b = rad(Double.parseDouble(lng1)) - rad(Double.parseDouble(lng2));
        return result(radLat1, radLat2, a, b);
    }

    /**
     * 计算两个经纬度之间的距离
     *
     * @param split1 经纬度数组 1
     * @param split2 经纬度数组 2
     * @return km
     */
    public static double getDistance(String[] split1, String[] split2) {
        double radLat1 = rad(Double.parseDouble(split1[0]));
        double radLat2 = rad(Double.parseDouble(split2[0]));
        double a = radLat1 - radLat2;
        double b = rad(Double.parseDouble(split1[1])) - rad(Double.parseDouble(split2[1]));
        return result(radLat1, radLat2, a, b);
    }

    private PointUtil() {
    }
}
